/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * @Autor: Lizardo Rios
 */

package configuraciones;

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.cip.esymons.general.be.Acceso;
import org.cip.esymons.general.be.Menu;
import org.cip.esymons.general.be.Permiso;
import org.cip.esymons.general.be.UsuarioWeb;

/**
 *
 * @author lizardo
 */
public class AccesoController {
    private Acceso acceso;
    private AccesoDelegate delegadoAcceso;
    private List<Acceso> listaAcceso;
    //private String mensaje;
    private String cuenta;
    private Integer menCodigo;
    private Integer modCodigo;
    private boolean accActivo;
    private Integer pmsCodigo;
    private String nombrePersona;

    /*********************** Constructor de la clase *************************/
    public AccesoController() {
        inicializar();
    }

    /*************************** Sets y Gettters *****************************/
    public AccesoDelegate getDelegadoAcceso() {
        return delegadoAcceso;
    }
    public void setDelegadoAcceso(AccesoDelegate delegadoAcceso) {
        this.delegadoAcceso = delegadoAcceso;
    }

    public List<Acceso> getListaAcceso() {
        return listaAcceso;
    }
    public void setListaAcceso(List<Acceso> listaAcceso) {
        this.listaAcceso = listaAcceso;
    }

    public Acceso getAcceso() {
        return acceso;
    }
    public void setAcceso(Acceso acceso) {
        this.acceso = acceso;
    }

    public String getNombrePersona() {
        mostrarPersona();
        return nombrePersona;
    }

    public void setNombrePersona(String nombrePersona) {
        this.nombrePersona = nombrePersona;
    }

    public String getCuenta() {
        return cuenta;
    }
    public void setCuenta(String cuenta) {
        this.cuenta = cuenta;
    }

    public Integer getMenCodigo() {
        return menCodigo;
    }
    public void setMenCodigo(Integer menCodigo) {
        this.menCodigo = menCodigo;
    }

    public Integer getModCodigo() {
        return modCodigo;
    }
    public void setModCodigo(Integer modCodigo) {
        this.modCodigo = modCodigo;
    }

    public boolean isAccActivo() {
        return accActivo;
    }
    public void setAccActivo(boolean accActivo) {
        this.accActivo = accActivo;
    }

    public Integer getPmsCodigo() {
        return pmsCodigo;
    }
    public void setPmsCodigo(Integer pmsCodigo) {
        this.pmsCodigo = pmsCodigo;
    }



//    public String getMensaje() {
//        return mensaje;
//    }
//    public void setMensaje(String mensaje) {
//        this.mensaje = mensaje;
//    }



    /**************************** Metodos ************************************/
    public String inicializar() {
        acceso = new Acceso();
        delegadoAcceso = new AccesoDelegate();
        listaAcceso = new ArrayList<Acceso>();
        pmsCodigo = 1;  //sin permiso
        //listar();
        return "";
    }

    public String buscarAccesos() {
        try {
            System.out.println("cuenta: " + cuenta);
            System.out.println("menCodigo: " + menCodigo);
            System.out.println("modCodigo: " + modCodigo);
            menCodigo = (menCodigo != null) ? menCodigo : 0;
            modCodigo = (modCodigo != null) ? modCodigo : 0;

            List<Menu> listaMenu = new ArrayList<Menu>();
//            MenuDelegate delegadoMenu = new MenuDelegate();
//            Menu menu = new Menu();
//            menu = delegadoMenu.find(menCodigo);
//            listaMenu = delegadoMenu.menuHijo(menu);

            listaMenu = delegadoAcceso.listarMenusFaltantes(cuenta, menCodigo);

            if (!listaMenu.isEmpty() && cuenta != null) {
//                listar();
//                if (!listaAcceso.isEmpty()) {
                    UsuarioWeb usr = new UsuarioWeb();
                    UsuarioWebDelegate delegadoUsuario = new UsuarioWebDelegate();
                    usr = delegadoUsuario.buscarUsuario(cuenta);
                    Permiso pms = new Permiso();
                    pms.setPmsCodigo(1);    //no tiene permiso por defecto
                    for (Menu men : listaMenu) {
                        Acceso acc = new Acceso();
                        acc.setAccActivo(false);
                        acc.setFkUweCuenta(usr);
                        acc.setFkPmsCodigo(pms);
                        acc.setFkMenCodigo(men);
                        delegadoAcceso.create(acc);
                    }
                    usr = null;
                    delegadoUsuario = null;
                    pms = null;
//                }
            }
        } catch (Exception ex) {
            listaAcceso = null;
            mostrarMensaje("ERROR: ", "No se pudo buscar los accesos...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        listar();
        return null;
    }

    public String guardar() {
        try {
//            Permiso pms = new Permiso();
//            PermisoDelegate delegadoPermiso = new PermisoDelegate();
            MenuDelegate delegadoMenu = new MenuDelegate();
            for (Acceso access : listaAcceso) {
//                access.setAccActivo(access.getAccActivo());
                //System.out.println("Permiso lista:  " + pmsCodigo);
                //pmsCodigo = (pmsCodigo != null) ? pmsCodigo : 1;    //1: no tiene permiso
                //pms = delegadoPermiso.find(pmsCodigo);
                //access.setFkPmsCodigo(pms);
                System.out.println("Activo: " + access.getAccActivo());
                System.out.println("Permiso: " + access.getFkPmsCodigo());
                delegadoAcceso.edit(access);
                //Menu menu = new Menu();
                //menu = access.getFkMenCodigo();
                delegadoMenu.edit(access.getFkMenCodigo());
            }

//            pms = null;
//            delegadoPermiso = null;
            mostrarMensaje("INFO: ", "Se registro los accesos sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede guardar el acceso. ", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return listar();
    }

    public String permisoTotal() {
        try {
            List<Acceso> listaAccesoTotal = new ArrayList<Acceso>();
            List<Menu> listaMenu = new ArrayList<Menu>();
            List<Menu> listaMenuX = new ArrayList<Menu>();
            MenuDelegate delegadoMenu = new MenuDelegate();
            listaMenuX = delegadoMenu.menuTodosHijo();
            for (Menu men : listaMenuX) {
                listaMenu = delegadoAcceso.listarMenusFaltantes(cuenta, men.getMenCodigo());
                if (!listaMenu.isEmpty() && cuenta != null) {
                        UsuarioWeb usr = new UsuarioWeb();
                        UsuarioWebDelegate delegadoUsuario = new UsuarioWebDelegate();
                        usr = delegadoUsuario.buscarUsuario(cuenta);
                        Permiso pms = new Permiso();
                        pms.setPmsCodigo(1);    //no tiene permiso por defecto
                        for (Menu menx : listaMenu) {
                            Acceso acc = new Acceso();
                            acc.setAccActivo(false);
                            acc.setFkUweCuenta(usr);
                            acc.setFkPmsCodigo(pms);
                            acc.setFkMenCodigo(menx);
                            delegadoAcceso.create(acc);
                        }
                        usr = null;
                        delegadoUsuario = null;
                        pms = null;
                }
                listaAccesoTotal = delegadoAcceso.listarAccesos(cuenta, men.getMenCodigo());
                for (Acceso access : listaAccesoTotal) {
                    access.setAccActivo(true);
                    delegadoAcceso.edit(access);
                }
            }
            mostrarMensaje("INFO: ", "Se otorgos todos los accesos sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede otorgar los accesos en forma total. ", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return listar();
    }

    public String actualizar() {
        try {
            delegadoAcceso.edit(acceso);
            mostrarMensaje("INFO: ", "Se modifico el acceso sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede actualizar el acceso. ", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return null;
    }

    public String eliminar() {
        try {
            delegadoAcceso.remove(acceso);
            mostrarMensaje("INFO: ", "Se elimino el acceso sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede eliminar el acceso. ", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return listar();
    }

    public String listar() {
        try {
            //acceso = new Acceso();
            listaAcceso = delegadoAcceso.listarAccesos(cuenta,menCodigo);
            //listaAcceso = delegadoAcceso.findAll();
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede listar el acceso. ", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "listar";
    }

    public String cancelar() {
        acceso = new Acceso();
        return null;
    }

    public String navegar_nuevo() {
        cancelar();
        return "nuevo";
    }

    public String navegar_editar() {
//        try {
//
//        } catch (Exception ex) {
//            Logger.getLogger(UsuarioWebController.class.getName()).log(Level.SEVERE, null, ex);
//        }
        return "editar";
    }

    public SelectItem[] getComboMenu(){
        try{
            MenuDelegate delegadoMenu = new MenuDelegate();
            System.out.println("modulo codigo: " + modCodigo);
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            modCodigo = (modCodigo != null) ? modCodigo : 0;
            List<Menu> listaMenus = delegadoMenu.menuPadre(modCodigo);
            selects = new SelectItem[listaMenus.size()];
            int cont = 0;
            for(Menu menu : listaMenus){
                SelectItem item = new SelectItem(menu.getMenCodigo(), menu.getMenNombre());
                selects[cont] = item;
                cont++;
            }
            System.out.println("OK......combo menu");
            return selects;
        }catch(Exception e){
            System.out.println("Ingreso Error");
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen menus");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboUsuarioWeb() {
        try {
            UsuarioWebDelegate delegadoUsuario = new UsuarioWebDelegate();
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<UsuarioWeb> listaUser = delegadoUsuario.findAll();
            delegadoUsuario = null;
            selects = new SelectItem[listaUser.size()];
            int cont = 0;
            for (UsuarioWeb usuario : listaUser) {
                SelectItem item = new SelectItem(usuario.getUweCuenta(), usuario.getUweCuenta());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen usuarios");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    private void mostrarPersona() {
        try {
            UsuarioWeb usr = new UsuarioWeb();
            UsuarioWebDelegate delegadoUsuario = new UsuarioWebDelegate();
            usr = delegadoUsuario.find(cuenta);
            nombrePersona = (usr != null) ? usr.getPerCodigo().getNombreCompleto() : "Elija usuario del sistema";
            usr = null;
            delegadoUsuario = null;
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

}
